
package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import java.text.Collator;
import java.util.Locale;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.CursoBD;

public class CursoDAO {
    
    // conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();        
    Statement BDCurso;
    ResultSet rs;
    
    // métodos unique, auto incremento.
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();

    //Utilizada para comparar strings
    Collator collator = Collator.getInstance (new Locale ("pt", "BR"));
    
    public int autoIncremento(){
        return metBD.autoIncremento("curso", "cod_curso");
    }
    
    public boolean inserirCurso(CursoBD cur){
        try
        {
            Connection con = conBD.conectar();
            boolean vnome;
            
            //verifica nome duplicado => False: Está duplicado, True: Não duplicado
            vnome = metBD.unique("curso", "nome_curso", cur.getNome());
            
            if(vnome){
                BDCurso = con.createStatement();
                BDCurso.execute("INSERT INTO curso VALUES ('"+cur.getCodigo()+"', "
                        + " '" + cur.getNome() + "', '" + cur.getTipoCurso() + "', "
                        + " '" + cur.getAnoInicio() + "', '"+cur.getDuracao()+ "', "
                        + " '" + cur.getCredito() + "', '"+cur.getTempoCredito()+"' );");

                JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso",
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;    
            }
            else //Nome duplicado
            {
                JOptionPane.showMessageDialog(null,"Curso já existe", 
                        "Nome duplicado no banco de dados", 
                        JOptionPane.ERROR_MESSAGE);
                con.close();
                return false;
            }
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,ex.getMessage(), 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);     
        }       
        return false;
    }
    
    public List<CursoBD> filtro(String campo, String valor) {      
        List<CursoBD> listaFiltro = new ArrayList<CursoBD>(); 
        try { 
            Connection con = conBD.conectar();
            BDCurso = con.createStatement();
            rs = BDCurso.executeQuery("SELECT * from curso where "+campo+" "
                    + " like '" + valor + "%'");
           
            if (rs != null) { 
                while (rs.next()) { 
                    CursoBD cr = new CursoBD();
                    cr.setCodigo(rs.getInt("cod_curso"));
                    cr.setNome(rs.getString("nome_curso"));
                    cr.setTipoCurso(rs.getString("tipo_curso"));
                    cr.setAnoInicio(rs.getInt("ano_inic_curso"));
                    cr.setDuracao(rs.getInt("duracao_curso"));
                    cr.setCredito(rs.getInt("credito_curso"));
                    cr.setTempoCredito(rs.getInt("tempocredito_curso"));
                    listaFiltro.add(cr); 
                }
                con.close();
                return listaFiltro; 
          }else { 
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }
    
    public boolean alterarCurso(CursoBD cr){
        String sql = "update curso set nome_curso = ?, "
                + " tipo_curso= ?, ano_inic_curso = ?, duracao_curso = ?, "
                + " credito_curso = ? , tempocredito_curso = ? ";
        sql += " where cod_curso = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();

            //Obtem o nome do curso e compara com o  
            //que foi ENVIADO para alteração (cr.get = o que o usuario digitou)
            // SELECT ira obter o atual para aquele codigo
            BDCurso = con.createStatement();
            rs = BDCurso.executeQuery("SELECT nome_curso from curso "
                    + " where cod_curso = '"+cr.getCodigo()+"'");
            rs.first();
            String capturaNome = rs.getString("nome_curso");
            
            //seta o nível de diferença quando forem comparadas
            collator.setStrength(Collator.PRIMARY);
            
            //verifica se já existe curso com aquele nome
            if(metBD.unique("curso", "nome_curso", cr.getNome()) || collator.compare(capturaNome, cr.getNome()) == 0 ){ // Deixa Cadastrar se usuario manteve o mesmo nome
                PreparedStatement ps = con.prepareStatement(sql);

                ps.setString(1, cr.getNome());
                ps.setString(2, (String.valueOf(cr.getTipoCurso())));
                ps.setString(3, (String.valueOf(cr.getAnoInicio())));
                ps.setString(4, (String.valueOf(cr.getDuracao())));
                ps.setString(5, (String.valueOf(cr.getCredito())));
                ps.setString(6, (String.valueOf(cr.getTempoCredito())));
                ps.setString(7, (String.valueOf(cr.getCodigo())));

                if (ps.executeUpdate() > 0) {
                    JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso",
                            "Alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }
            }else{
                JOptionPane.showMessageDialog(null,"Curso já existe",
                        "Nome duplicado", JOptionPane.INFORMATION_MESSAGE);
                return false;
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }  
    }

    public boolean excluirCurso(int codigoEnviado){
        String sql = "delete from curso where cod_curso = ?";   
              
        try {
            Connection con = conBD.conectar();
                                      
            //Verifica se curso que foi ENVIADO é usado para algum Aluno
            BDCurso = con.createStatement();
            rs = BDCurso.executeQuery("SELECT count(cod_curso) from aluno "
                    + "where cod_curso = '"+codigoEnviado+"' ");
            rs.last();
            int capturaAluno= rs.getInt(1);
            
           //Verifica se curso que foi ENVIADO é usado para alguma Turma
            BDCurso = con.createStatement();
            rs = BDCurso.executeQuery("SELECT count(cod_curso) from turma "
                    + " where cod_curso = '"+codigoEnviado+"' ");
            rs.last();
            int capturaturma= rs.getInt(1);

            
            if(capturaAluno >= 1 || capturaturma >=1){ //Possui FK's?
                if(capturaAluno >= 1 && capturaturma >= 1){ //Duas FK's?
                    JOptionPane.showMessageDialog(null,"Curso esta ligado a aluno e a turma,"
                            + " não pode ser excluído", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);                   
                }
                else{
                    if(capturaAluno >= 1){ // só a aluno
                        JOptionPane.showMessageDialog(null,"Curso esta ligado a aluno,"
                                + " não pode ser excluído", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);
                    }
                    if(capturaturma >= 1){ // só a disciplina
                        JOptionPane.showMessageDialog(null,"Curso esta ligado a turma,"
                                + " não pode ser excluído", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);  
                    }
                } 
                con.close();
                return false;              
            }
            else{
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, (String.valueOf(codigoEnviado)));
                if (ps.executeUpdate() > 0) {
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }               
            }

        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,e.getMessage(), 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
   } 
    
   public List<CursoBD> carregarComboCurso(){
        List<CursoBD> listacurso = new ArrayList<CursoBD>(); //Lista para Codigo + nome
        try
        {      
            Connection con = conBD.conectar();         
            BDCurso = con.createStatement();
            rs = BDCurso.executeQuery("SELECT cod_curso, nome_curso "
                    + " from curso ");
            
            CursoBD selecioneCurso = new CursoBD();
            selecioneCurso.setCodigo(-1);
            selecioneCurso.setNome("-- Selecione um curso --");
            listacurso.add(selecioneCurso);
            
            while(rs.next()){
                CursoBD curs = new CursoBD();
                curs.setCodigo(rs.getInt("cod_curso"));
                curs.setNome(rs.getString("nome_curso"));
                listacurso.add(curs);
            }  
            con.close();  
            return listacurso;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }
        return listacurso;
    }  
   
   public int buscarTempoCreditos(String raAluno) throws SQLException{
            Connection con = conBD.conectar();
            BDCurso = con.createStatement();
            int tempo = 0;
            rs = BDCurso.executeQuery("SELECT tempocredito_curso from aluno a, curso c "
                        + " where a.cod_curso = c.cod_curso and a.ra_al = " + raAluno );
             
            if(rs != null){
                  while (rs.next()) {
                      tempo = rs.getInt("tempocredito_curso");
                  }
             }
             return tempo;
    }
    
    public int buscarCreditosCurso(String raAluno) throws SQLException{
            Connection con = conBD.conectar();
            BDCurso = con.createStatement();
            int tempo = 0;
            rs = BDCurso.executeQuery("SELECT credito_curso from aluno a, curso c "
                        + " where a.cod_curso = c.cod_curso and a.ra_al = " + raAluno );
             
            if(rs != null){
                  while (rs.next()) {
                      tempo = rs.getInt("credito_curso");
                  }
             }
             return tempo;
    }
}
